export class storageManager {
    /**
     * 构造函数
     * @param {string} projectKey - 项目唯一标识，用于混淆 key，避免不同项目的 key 冲突
     */
    constructor(projectKey) {
        this.projectKey = projectKey;
    }

    /**
     * 混淆 key，避免不同项目的 key 冲突
     * @param {string} key - 原始 key
     * @returns {string} - 混淆后的 key
     */
    _getProcessedKey(key) {
        return `${this.projectKey}_${key}`;
    }

    /**
     * 设置数据
     * @param {string} key - 键
     * @param {any} value - 值，支持 JSON 数据
     * @param {number} ttl - 数据过期时间（单位：秒），可选
     */
    set(key, value, ttl = null) {
        if (typeof key !== 'string') {
            throw new Error('键必须是字符串');
        }
        const processedKey = this._getProcessedKey(key);
        const data = {
            value,
            expires: ttl ? Date.now() + ttl * 1000 : null, // 计算过期时间
        };
        localStorage.setItem(processedKey, JSON.stringify(data));
    }

    /**
     * 获取数据
     * @param {string} key - 键
     * @param {any} defaultValue - 默认值，当 key 不存在或数据过期时返回
     * @returns {any} - 解析后的 JSON 数据，如果不存在或过期则返回默认值
     */
    get(key, defaultValue = null) {
        const processedKey = this._getProcessedKey(key);
        const data = localStorage.getItem(processedKey);
        if (!data) return defaultValue;

        const parsedData = JSON.parse(data);
        if (parsedData.expires && Date.now() > parsedData.expires) {
            this.delete(key); // 如果数据已过期，删除并返回默认值
            return defaultValue;
        }
        return parsedData.value;
    }

    /**
     * 删除数据
     * @param {string} key - 键
     */
    delete(key) {
        const processedKey = this._getProcessedKey(key);
        localStorage.removeItem(processedKey);
    }

    /**
     * 清空数据
     * @param {boolean} onlyExpired - 是否只清除过期的数据，默认为 false
     */
    clear(onlyExpired = false) {
        Object.keys(localStorage).forEach((key) => {
            if (key.startsWith(`${this.projectKey}_`)) {
                if (onlyExpired) {
                    const data = localStorage.getItem(key);
                    const parsedData = JSON.parse(data);
                    if (parsedData.expires && Date.now() > parsedData.expires) {
                        localStorage.removeItem(key); // 只删除过期数据
                    }
                } else {
                    localStorage.removeItem(key); // 删除所有数据
                }
            }
        });
    }

    /**
     * 批量设置数据
     * @param {Object} data - 键值对对象
     */
    setMany(data) {
        Object.entries(data).forEach(([key, value]) => {
            this.set(key, value);
        });
    }

    /**
     * 批量获取数据
     * @param {string[]} keys - 键数组
     * @returns {Object} - 键值对对象
     */
    getMany(keys) {
        return keys.reduce((result, key) => {
            result[key] = this.get(key);
            return result;
        }, {});
    }

    /**
     * 批量删除数据
     * @param {string[]} keys - 键数组
     */
    deleteMany(keys) {
        keys.forEach((key) => this.delete(key));
    }

    /**
     * 监听 localStorage 变化
     * @param {Function} callback - 回调函数
     */
    onChange(callback) {
        window.addEventListener('storage', (event) => {
            if (event.storageArea === localStorage && event.key.startsWith(`${this.projectKey}_`)) {
                callback(event); // 触发回调
            }
        });
    }
}

// 默认示例
export const storage = new storageManager('zdpui');

